using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ProcessMonitor
{
    public class WinProcess
    {

        /// <summary>
        ///  该函数将创建指定窗口的线程设置到前台，并且激活该窗口。键盘输入转向该窗口，并为用户改各种可视的记号。
        ///  系统给创建前台窗口的线程分配的权限稍高于其他线程。 
        /// </summary>
        /// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>
        /// <returns>如果窗口设入了前台，返回值为非零；如果窗口未被设入前台，返回值为零</returns>
        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);



        /// 该函数设置由不同线程产生的窗口的显示状态
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="cmdShow">指定窗口如何显示。查看允许值列表，请查阅ShowWlndow函数的说明部分</param>
        /// <returns>如果函数原来可见，返回值为非零；如果函数原来被隐藏，返回值为零</returns>
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
        [DllImport("user32.dll")]
        private static extern bool IsIconic(IntPtr hWnd);
        // 消息函数
        [DllImport("user32.dll", EntryPoint = "PostMessageA")]
        public static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string strclassName, string strWindowName);
        [DllImportAttribute("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MAXIMIZE = 0xF030;



        public void SetForm(string exeFullName)
        {
            Process[] processes = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(exeFullName.Split(' ')[0]));

            var thspro = processes.FirstOrDefault(p => p.MainModule.FileName == exeFullName.Split(' ')[0]);

            if (processes.Length > 0 && thspro != null)
            {
                IntPtr hWnd = thspro.MainWindowHandle;

                if (IsIconic(hWnd))
                    ShowWindowAsync(hWnd, 9);// 9就是SW_RESTORE标志，表示还原窗体
                                             //SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
                SetForegroundWindow(hWnd);
            }
            else
            {
                var exearg = exeFullName.Split(' ');
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.FileName = exearg[0];
                psi.UseShellExecute = false;
                psi.WorkingDirectory = Path.GetDirectoryName(exeFullName);
                psi.CreateNoWindow = false;
                if (exearg.Length > 1)
                {
                    psi.Arguments = exeFullName.Replace(exearg[0], "").Trim();
                }
                Process.Start(psi);
            }
        }
    }
}
